package com.vteba.utils.web.http;

import java.io.File;
import java.util.List;
import java.util.Map;

/**
 * http(s)服务调用接口
 * @author yinlei
 * @date 2014年11月11日 上午11:19:42
 */
public interface HttpService {
	/**
	 * get请求，返回结果是json格式
	 * @param url url
	 * @param resultClass 结果泛型类
	 * @return 请求结果
	 */
	public <T> T getBean(String url, Class<T> resultClass);
	
	/**
	 * get请求，返回结果是json格式
	 * @param url url
	 * @param params 参数
	 * @param resultClass 结果泛型类
	 * @return 请求结果
	 */
	public <T> T getBean(String url, Map<String, String> params, Class<T> resultClass);
	
	/**
	 * get请求，返回结果是json格式
	 * @param url url
	 * @param params 参数
	 * @param resultClass 结果泛型类
	 * @return 请求结果
	 */
	public <T> T getBean(String url, Object params, Class<T> resultClass);
	
	/**
	 * get请求获取list，返回结果是json格式
	 * @param url url
	 * @param resultClass 结果泛型类
	 * @return 结果list
	 */
	public <T> List<T> getList(String url, Class<T> resultClass);
	
	/**
	 * get请求获取list，返回结果是json格式
	 * @param url url
	 * @param params 参数
	 * @param resultClass 结果泛型类
	 * @return 结果list
	 */
	public <T> List<T> getList(String url, Map<String, String> params, Class<T> resultClass);
	
	/**
	 * get请求获取list，返回结果是json格式
	 * @param url url
	 * @param params 参数
	 * @param resultClass 结果泛型类
	 * @return 结果list
	 */
	public <T> List<T> getList(String url, Object params, Class<T> resultClass);
	
	/**
	 * get请求
	 * @param url url
	 * @return 请求结果
	 */
	public byte[] getByte(String url);
	
	/**
	 * get请求
	 * @param url url
	 * @param params 参数
	 * @return 请求结果
	 */
	public byte[] getByte(String url, Map<String, String> params);
	
	/**
	 * get请求
	 * @param url url
	 * @param params 参数
	 * @return 请求结果
	 */
	public byte[] getByte(String url, Object params);
	
	/**
	 * post请求，返回结果是json格式
	 * @param url url
	 * @param resultClass 结果泛型类
	 * @return 请求结果Bean
	 */
	public <T> T postBean(String url, Class<T> resultClass);
	
	/**
	 * post请求，返回结果是json格式
	 * @param url url
	 * @param params 参数
	 * @param resultClass 结果泛型类
	 * @return 请求结果bean
	 */
	public <T> T postBean(String url, Map<String, String> params, Class<T> resultClass);
	
	/**
	 * post请求，参数是json格式，返回结果也是json。
	 * @param url url，不含前缀
	 * @param params 参数
	 * @param resultClass 结果类型
	 * @return 调用结果Bean
	 */
	public <T> T postBean(String url, Object params, Class<T> resultClass);
	
	/**
	 * post请求获取list，返回结果是json格式
	 * @param url url
	 * @param resultClass 结果泛型类
	 * @return 请求结果list
	 */
	public <T> List<T> postList(String url, Class<T> resultClass);
	
	/**
	 * post请求获取list，返回结果是json格式
	 * @param url url
	 * @param params 参数
	 * @param resultClass 结果泛型类
	 * @return 请求结果list
	 */
	public <T> List<T> postList(String url, Map<String, String> params, Class<T> resultClass);
	
	/**
	 * post请求获取list，参数是json格式，返回结果也是json。
	 * @param url url，不含前缀
	 * @param params 参数
	 * @param resultClass 结果类型
	 * @return 请求结果List
	 */
	public <T> List<T> postList(String url, Object params, Class<T> resultClass);
	
	/**
	 * post请求，返回结果格式由双方约定，再行解析
	 * @param url url
	 * @return 请求结果
	 */
	public byte[] postByte(String url);
	
	/**
	 * post请求，返回结果格式由双方约定，再行解析
	 * @param url url
	 * @param params 参数
	 * @return 请求结果
	 */
	public byte[] postByte(String url, Map<String, String> params);
	
	/**
	 * post请求，参数是json格式，返回结果由双方约定。先返回字节数组，然后自行解析。
	 * @param url url，不含前缀
	 * @param params 参数
	 * @return 调用结果byte[]
	 */
	public byte[] postByte(final String url, final Object params);
	
	/**
	 * post请求，下载文件
	 * @param url url
	 * @return 文件字节数组
	 */
	public byte[] download(final String url);
	
	/**
	 * post请求，下载文件
	 * @param url url
	 * @param params 参数
	 * @return 文件字节数组
	 */
	public byte[] download(final String url, final Map<String, String> params);
	
	/**
	 * post请求下载文件，参数是json格式，返回结果由双方约定。先返回字节数组，然后自行解析。
	 * @param url url，不含前缀
	 * @param params 参数
	 * @return 文件字节数组
	 */
	public byte[] download(final String url, final Object params);
	
	/**
	 * 上传文件，返回结果的格式由双方约定，然后再解析。
	 * @param url url
	 * @param fileParams 文件参数
	 * @return 结果byte[]
	 */
	public byte[] upload(final String url, final Map<String, File> fileParams);
	
	/**
	 * post上传文件，以及文本参数
	 * @param url url
	 * @param fileParams 文件参数
	 * @param textParams 文本参数
	 * @return 返回结果
	 */
	public byte[] upload(final String url, final Map<String, File> fileParams, final Map<String, String> textParams);
	
	/**
     * post上传文件，以及普通参数。
     * @param url 请求url地址
     * @param params 请求参数，value只可以为File，或普通String参数。其他类型的参数会被忽略。
     * @return 返回结果
     */
	public byte[] uploadFile(final String url, final Map<String, Object> params);
	
	/**
	 * post上传文件，返回结果是json格式
	 * @param url url
	 * @param fileParams 文件参数
	 * @param resultClass 结果类
	 * @return 上传结果
	 */
	public <T> T upload(final String url, final Map<String, File> fileParams, Class<T> resultClass);
	
	/**
	 * post上传文件，以及普通参数，返回结果是json格式
	 * @param url url
	 * @param fileParams 文件参数
	 * @param textParams 文本参数
	 * @param resultClass 结果类
	 * @return 上传结果
	 */
	public <T> T upload(final String url, final Map<String, File> fileParams, final Map<String, String> textParams, Class<T> resultClass);
	
	/**
     * post上传文件，以及普通参数，返回结果是json格式
     * @param url 请求url地址
     * @param params 请求参数，value只可以为File，或普通String参数。其他类型的参数会被忽略。
     * @return 返回结果
     */
	public <T> T uploadFile(final String url, final Map<String, Object> params, Class<T> resultClass);
}
